#include <iostream>
#include <cstdio>
#include <unistd.h>
#include "rejilla.h"
#include <sys/time.h>

int calcularConway(Rejilla estadoAnterior,int fila,int columna);

int main(int argc, char** argv){
    struct timeval t0, t1;
    double tej;

    gettimeofday(&t0,0);    

    Rejilla control("../rejillas/porongas", 3);

    Rejilla conBorde(control.getAlto()+2, control.getAncho()+2, control.getAncho());
    conBorde.setSector(1,1,control.getMatriz());

    for(int ciclos = 0; ciclos < 30 ; ciclos++){
        for(int i = 0; i < control.getAlto(); i++ ){
            for(int j = 0; j < control.getAncho(); j++){
                control.setElemento(i,j,calcularConway(conBorde,i+1,j+1));
                }
            }
        conBorde.setSector(1,1,control.getMatriz());
        }

    gettimeofday(&t1,0);
    tej = (t1.tv_sec - t0.tv_sec) + (t1.tv_usec - t0.tv_usec) / 1e6;
    cout << tej << endl;  


    return 1;
    }

int calcularConway(Rejilla estadoAnterior,int fila,int columna){
    /** 
     *Para calcular el nuevo estado de una celda, vemos el estado actual y actuamos en funcion 
     *de la cantidad de celulas vivas que tenga alrededor*/
    int estado = estadoAnterior.getElemento(fila,columna);
    int vivos = 0;
    
    for(int k = -1; k <= 1; k++){
        for(int z = -1; z <= 1; z++){
            if(estadoAnterior.getElemento(fila+k,columna+z) == 1 && !(k == 0 && z == 0)){
                vivos++;
                }
            }
        }  
    if(estado == 1){
        if(vivos == 3 || vivos == 2){
            /** Si la celda esta vivo y tiene 2 o 3 celdas vivas alredor sigue vivo */
            return 1;
            }
        }
    else{
        if(vivos == 3){
            /** Si la celda esta muerta y tiene 3 celdas vivas alrededor nace */
            return 1;
            }
        }

    /**
     * Si no se da ninguno de los casos anteriores la celda muere,
     * o bien por superpoblacion o bien por soledad
     */
    return 0;
    }

